﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Xml.Linq;
using System.Windows.Controls;
using System.Windows.Threading;

namespace StupidChineseSegmenter
{
    public partial class MainWindow
    {

        internal string Convert(string sourceText, string dictPath, ProgressBar progressBar)
        {
            XDocument xdoc = XDocument.Load(dictPath);
            int position_pointer = 0;
            int segment_size = 4;
            string temp_segment = "";
            StringBuilder resultText = new StringBuilder();
            XElement xtmp;

            UpdateProgressBarDelegate updatePbDelegate =
                new UpdateProgressBarDelegate(progressBar1.SetValue);

            // boucle dont la condition d'arrêt doit prendre en compte la taille du segment (doit être supérieure à 0)
            // ainsi que la taille du texte : il ne faut pas que position_pointer + segment_size > sourceText.Length
            
            while (position_pointer < sourceText.Length)
            {
                // faire un filtre avant de s'attaquer au segment en cours pour vérifier si le 
                // prochain character est bien un kanji
            exit:
                segment_size = 4;
                // mise à jour de la barre de progression
            double value = position_pointer * 100 / sourceText.Length;

            Dispatcher.Invoke(updatePbDelegate,
                System.Windows.Threading.DispatcherPriority.Background,
                new object[] { ProgressBar.ValueProperty, value });


                for (int i = segment_size; i > 0; i--, segment_size--)
                {
                    while(position_pointer + segment_size > sourceText.Length)
                    {
                        segment_size--;
                        if (segment_size == 0)
                            return resultText.ToString();
                    }
                    temp_segment = sourceText.Substring(position_pointer, segment_size);
                    // cherche dans le dico
                    var query = from word in xdoc.Element("dic").Elements()
                                where word.Element("traditional").Value.ToString() == temp_segment
                                select word;

                    if (query.ToArray().GetLength(0) > 0)
                    {
                        xtmp = query.ToArray()[0];
                        resultText.AppendFormat("{0}\t{1}\n", 
                            xtmp.Element("traditional").Value.ToString(),
                            PinyinFormatCorrection(xtmp.Element("pinyin").Value.ToString()));

                        foreach (XElement elem in xtmp.Elements("translations"))
                        {
                            resultText.AppendFormat("{0}\n",
                                TranslationFormatCorrection(elem.Element("translation").Value.ToString()));
                        }
                        resultText.Append("\n");

                        position_pointer += segment_size;
                        goto exit;
                    }
                    if (segment_size == 1)
                    {
                        position_pointer++;
                        goto exit;
                    }
                }
            }

            return resultText.ToString();
        }

        /*
         * De base les traductions affichées commencent par un caractère [
         * qui n'est pas souhaitable
         * */
        string TranslationFormatCorrection(string param)
        {
            if (param.Substring(0, 1).Equals("["))
                return param.Substring(1, param.Length - 1);
            return param;
        }

        /* Le problème avec le formatage brut récupéré est :
         * - qu'il commence est fini par un caractère de guillemets double
         * - ne sépare pas les lectures des caractères
        */
        string PinyinFormatCorrection(string param)
        {
            StringBuilder niceFormat = new StringBuilder();
            foreach (char c in param.ToCharArray())
            {
                if (!c.Equals("\""))
                {
                    niceFormat.Append(c);
                }
                if (Char.IsDigit(c))
                {
                    niceFormat.Append(" ");
                }
            }
            return niceFormat.ToString();
        }
    }
}
